package sixth.instanceof关键字;

class A1 {
    public void fun1() {
        System.out.println("A--fun1()");
    }

    public void fun2() {
        System.out.println("A--fun2()");
    }
}

class B1 extends A1 {
    public void fun1() {
        System.out.println("B--fun1()");
    }

    public void fun3() {
        System.out.println("B--fun3()");
    }
}

class C1 extends A1 {
    public void fun1() {
        System.out.println("C--fun1()");
    }

    public void fun4() {
        System.out.println("C--fun4()");
    }
}

public class 在进行向下转型前进行验证 {
    public static void main(String[] args) {
        fun(new B1());//传递B类实例 产生向上转型
        fun(new C1());//传递C类实例 产生向上转型
    }

    public static void fun(A1 a) {
        a.fun1();
        if (a instanceof B1) {
            // B向下转型
            B1 b1 = (B1) a;
            b1.fun3();
        }
        if (a instanceof C1) {
            // C向下转型
            C1 c1 = (C1) a;
            c1.fun4();
        }
    }
}
/*
D:\WorkSpaces\Java\jdk-21\bin\java.exe "-javaagent:D:\Software\IntelliJ IDEA\IntelliJ IDEA 2023.3.2\lib\idea_rt.jar=65403:D:\Software\IntelliJ IDEA\IntelliJ IDEA 2023.3.2\bin" -Dfile.encoding=UTF-8 -Dsun.stdout.encoding=UTF-8 -Dsun.stderr.encoding=UTF-8 -classpath D:\WorkSpaces\JavaDevelopBase_start_329\out\production\JavaDevelopBase_start_329 sixth.instanceof关键字.在进行向下转型前进行验证
B--fun1()
B--fun3()
C--fun1()
C--fun4()

Process finished with exit code 0

 */
/**
 * 向下转型是为了什么 为了调用子类自己的方法
 * 但是每次再需要调用其他子类的方法 就要继续为其他子类向下转型 就要继续coding修改fun（）方法
 * 问：这里的父类设计的不是很合理？
 * 答：在类设计时永远不要去继承一个已经实现好的类
 * 在类的设计中 重点在于父类的设计 而且在类的设计中 永远不要去继承一个已经实现好的类 只能继承抽象类或实现接口
 * 因为一旦发生对象的向上转型之后 所调用的方法一定是被子类覆写过的方法
 */